// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef UI_APP_LIST_VIEWS_APP_LIST_DRAG_AND_DROP_HOST_H_
#define UI_APP_LIST_VIEWS_APP_LIST_DRAG_AND_DROP_HOST_H_

#include <string>

namespace gfx {
class Point;
class Vector2d;
} // namespace gfx

namespace app_list {

// This class will get used by the AppListView to drag and drop Application
// shortcuts onto another host (the launcher).
class ApplicationDragAndDropHost {
public:
    // Create an OS dependent drag proxy icon which can escape the given view.
    // The proxy should get created using the |icon| with a magnification of
    // |scale_factor| at a center location of |location_in_screen_coordinates.
    // Use |replaced_view| to find the screen which is used.
    // The |cursor_offset_from_center| is the offset from the mouse cursor to
    // the center of the item.
    virtual void CreateDragIconProxy(
        const gfx::Point& location_in_screen_coordinates,
        const gfx::ImageSkia& icon,
        views::View* replaced_view,
        const gfx::Vector2d& cursor_offset_from_center,
        float scale_factor)
        = 0;

    // Update the screen location of the Drag icon proxy.
    virtual void UpdateDragIconProxy(
        const gfx::Point& location_in_screen_coordinates)
        = 0;

    // Remove the OS dependent drag proxy from the screen.
    virtual void DestroyDragIconProxy() = 0;

    // A drag operation could get started. The recipient has to return true if
    // he wants to take it - e.g. |location_in_screen_poordinates| is over a
    // target area. The passed |app_id| identifies the application which should
    // get dropped.
    virtual bool StartDrag(const std::string& app_id,
        const gfx::Point& location_in_screen_coordinates)
        = 0;

    // This gets only called when the |StartDrag| function returned true and it
    // dispatches the mouse coordinate change accordingly. When the function
    // returns false it requests that the operation be aborted since the event
    // location is out of bounds.
    // Note that this function does not update the drag proxy's screen position.
    virtual bool Drag(const gfx::Point& location_in_screen_coordinates) = 0;

    // Once |StartDrag| returned true, this function is guaranteed to be called
    // when the mouse / touch events stop. If |cancel| is set, the drag operation
    // was aborted, otherwise the change should be kept.
    virtual void EndDrag(bool cancel) = 0;
};

} // namespace app_list

#endif // UI_APP_LIST_VIEWS_APP_LIST_DRAG_AND_DROP_HOST_H_
